/****************************************************************************
                Университет:    Санкт-Петербургский Политехнический Университет
                Кафедра:        Компьютерные системы и программные технологии
                Аспирант:       Быков Илья Иванович
                Программа:      Расчет коэффициентов распределения
                Модуль:         edge.h
                Назначение:
****************************************************************************/

#ifndef EDGE_H
#define EDGE_H

#include <QGraphicsItem>

class Node;


class Edge : public QGraphicsItem
{
public:
    Edge(Node *sourceNode, Node *destNode);
    Edge(Node *sourceNode, Node *destNode, int state,
         double r_r, double r_x,
         double p_a, double p_r,
         double otr_pow, double pol_pow);

    Node *sourceNode() const;
    Node *destNode() const;
    Node *oppositeNode(Node *node) const;

    void adjust();

    enum { Type = UserType + 2 };
    int type() const { return Type; }
    
    // Номер
    int number() const;
    void setNumber(int number);

    // Сопротивление
    void getResist(double &R, double &X);
    void setResist(const double R, const double X);

    // Мощность
    void getPower(double &pow_a, double &pow_r);
    void setPower(const double pow_a, const double pow_r);

    void getLimitPower(double &otr_pow_a, double &pol_pow_a);
    void setLimitPower(double otr_pow_a, double pol_pow_a);

    void setPrecision(int precision);
    void setResistanceState(bool state);

    // Состояние ветви
    int getstate();
    void setState(int state);

    static bool lessThan(Edge *e1, Edge *e2);

protected:
    QRectF boundingRect() const;
    QPainterPath shape() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    
private:
    Node *m_source; // Начальный узел
    Node *m_dest;   // Конечный узел
    int m_number;   // Номер ветви

    QPointF m_sourcePoint;  // Начальная точка
    QPointF m_destPoint;    // Конечная точка

    double m_resist_R;      // Активное сопротивление
    double m_resist_X;      // Реактивное сопротивление

    double m_power_a;       // Активная мощность
    double m_power_r;       // Реактивная мощность

    double m_otr_pow_a;
    double m_pol_pow_a;

    int  m_state;           // Состояние ветви (включена\отключена)

    int m_power_precision;  // Количество знаком после запятой в активной мощности
    bool m_resistance_visible;
};


#endif
